package me.dl.util

/**
  * Created by dl 
  */
object ArgUtilImplicits {

  implicit class IfArgNonEmptyThenDo[T](val self: T) extends AnyVal {

    def ifNonEmptyThen[K, V](arg: java.util.Map[K, V])(f: T => (java.util.Map[_ >: K, _ >: V] => Unit)): T = {
      if (arg != null && arg.size() > 0) f(self)
      self
    }

    def ifNonEmptyThen[V](arg: java.util.Collection[V])(f: T => (java.util.Collection[_ >: V] => Unit)): T = {
      if (arg != null && arg.size() > 0) f(self)
      self
    }

    def ifNonEmptyThen[V](arg: scala.collection.GenTraversableOnce[V])(f: T => (scala.collection.GenTraversableOnce[V] => Unit)): T = { // GenTraversableOnce具备泛型变性
      if (arg != null && arg.nonEmpty) f(self)(arg)
      self
    }

    //不定义 def ifArgNonEmpty(arg:AnyRef)，因为non-empty语义用于容器类型，AnyRef仅有non-null语义不具备non-empty语义，不定义以避免误导使用者

    /**
      * 主要为这样的场景设计：要调用对象的某个有且仅有一个参数的方法，但需要事先检查参数是否空（.ifNonEmptyThen）/null（.ifNonNullThen），然后再调用，为了使得代码看起来是连续调用而为该类增强这样一个方法。
      * 对于对象x,其接受一个参数的方法f,需要判断给定的参数arg，则一般的代码形式为 x.ifNonNullThen(arg)(_.f)。
      *
      */
    def ifNonNullThen[Arg](arg: Arg)(f: T => (Arg => Unit)): T = {
      if (arg != null) f(self)(arg)
      self
    }
  }

}